package demo.Design.Module.Porxy.JDkPoxy;

import demo.Design.Module.Porxy.Static.Sing;
import demo.Design.Module.Porxy.Static.Target;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/10/14-10-14-9:39
 * @Description：demo.Design.Module.Porxy.JDkPoxy
 */
public class JDKPorxy {

    public static void main(String[] args) {
        //动态产生代理类
        ClassLoader classLoader = Target.class.getClassLoader();
        Class<?>[] interfaces = Target.class.getInterfaces();
        InvocationHandler myInvocationHandler = new MyInvocationHandler();

        //左边是接口，右边是代理类
        Sing sing = (Sing) Proxy.newProxyInstance(classLoader, interfaces, myInvocationHandler);

        sing.sing();       //代理的方法，增强的方法（InvocationHandler.invoke）
    }
}

//代理逻辑，将来该类中的增强方法会自动掉用
class MyInvocationHandler implements InvocationHandler{

    /**
     * 代理的方法， 增强的方法
     * @param proxy        产生的代理类
     * @param method       目标方法 target.sing
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Target target = Target.class.newInstance();
        //目标方法执行
        System.out.println("hello");
        method.invoke(target,args);                           //若目标方法有返回值则返回
        System.out.println("goodbye");
        //其他方法
        return null;
    }
}